/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package fuzzy.actions;

import fuzzy.hibernate.Funkcje;
import fuzzy.hibernate.HibernateUtil;
import fuzzy.hibernate.Klienci;
import fuzzy.hibernate.Uzytkownicy;
import fuzzy.tools.Tools;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionErrors;

import org.apache.struts.actions.DispatchAction;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author michal
 */
public class FuzzyAction extends DispatchAction {

    /* forward name="success" path="" */
    private final static String SUCCESS = "success";

    public ActionForward list(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        Session currentSession = HibernateUtil.getSession();
        currentSession.beginTransaction();
        
        // Pobieramy wszystkie funkcje z bazy.
        Query q = currentSession.createQuery("FROM Funkcje ORDER BY nazwatabeli, kolumnatabeli, nr");
        List<Funkcje> funkcje = q.list();
        List<FuzzyForm> functions = new ArrayList();
        
        for (Funkcje funkcja: funkcje) {
            FuzzyForm function = new FuzzyForm();
            function.setFunNr(funkcja.getFunNr());
            function.setNazwatabeli(funkcja.getNazwatabeli());
            function.setKolumnatabeli(funkcja.getKolumnatabeli());
            function.setNazwalingwistyczna(funkcja.getNazwalingwistyczna());
            function.setWartosc(funkcja.getWartosc());
            function.setNr(funkcja.getNr());
            functions.add(function);
        }
        
        request.setAttribute("functions", functions);
        
        return mapping.findForward("list");
    }
    
    public ActionForward manage(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        int functionId = Tools.getClientId(request.getParameter("functionId"));
        Uzytkownicy loggedUser = Tools.getUser(request);
        
        if (!loggedUser.isUserInRole("admin")) {
            response.sendError(403, "Access Denied");
        }
        
        FuzzyForm functionBean = (FuzzyForm) form; // Dane z formularza.
        Funkcje function;
        
        Session currentSession = HibernateUtil.getSession();
        currentSession.beginTransaction();
        
        // Sprawdzamy, czy użytkownik chce edytować dane funkji.
        if (functionId > 0) {
            Query q = currentSession.createQuery("FROM Funkcje WHERE fun_nr = :functionId");
            q.setParameter("functionId", functionId);
            function = (Funkcje) q.uniqueResult();

            functionBean.setFunNr(function.getFunNr());
            //functionBean.setNazwatabeli(function.getNazwatabeli());
            //functionBean.setKolumnatabeli(function.getKolumnatabeli());
            //functionBean.setNazwalingwistyczna(function.getNazwalingwistyczna());
            functionBean.setWartosc(function.getWartosc());
            //functionBean.setNr(function.getNr());
            
            q = currentSession.createQuery("FROM Funkcje WHERE kolumnatabeli = :column");
            //q.setParameter("table", (function.getNazwatabeli() == null ? "" : function.getNazwatabeli()));
            q.setParameter("column", function.getKolumnatabeli());
            List<Funkcje> functions = q.list();
            System.out.println("SIZE IS " + functions.size() + "|"+ function.getNazwatabeli()+"|"+function.getKolumnatabeli());
            if (functions.size() == 3) {
                request.setAttribute("valueA", functions.get(0).getWartosc());
                request.setAttribute("valueB", functions.get(1).getWartosc());
                request.setAttribute("valueC", functions.get(2).getWartosc());
            }
            
        }
        // Dodanie nowej funkcji.
        else {
            function = new Funkcje(); // Encja funkji.
        }
        
        if (functionBean.isSent()) {
            ActionErrors errors = functionBean.validate(mapping, request);
            
            if (!errors.isEmpty()) {
                saveErrors(request, errors);
                return mapping.findForward("failure");
            }
        } else {
            return mapping.findForward("failure");
        }
        
        // Zapisujemy dane do encji funkcji.
        function.setWartosc(functionBean.getWartosc());
        
        currentSession.saveOrUpdate(function);
        currentSession.getTransaction().commit();
        
        return mapping.findForward(SUCCESS);
    }
}
